﻿using MediatR;
using System;
using static System.Collections.Specialized.BitVector32;
using static System.Net.Mime.MediaTypeNames;

namespace Sgr.AspNetCore.Middlewares.Security
{
    /// <summary>
    /// 安全头部配置选项
    /// </summary>
    public class SecurityHeadersOptions
    {
        /// <summary>
        /// PoweredBy 功能是否启用
        /// </summary>
        public bool EnabledPoweredBy { get; set; } = true;

        /// <summary>
        /// PoweredBy 头部名称
        /// </summary>
        public string PoweredByHeaderName { get; set; } = Constant.POWEREDBY_HEADERNAME;

        /// <summary>
        /// PoweredBy 头部值
        /// </summary>
        public string PoweredByHeaderValue { get; set; } = Constant.POWEREDBY_HEADERVALUE;

        /// <summary>
        /// 是否启用安全头部
        /// </summary>
        public bool EnableSecurityHeaders { get; set; } = true;

        /// <summary>
        /// 是否启用 XSS 保护
        /// </summary>
        public bool EnableXssProtection { get; set; } = true;

        /// <summary>
        /// 是否启用内容类型选项（防止MIME类型嗅探）
        /// </summary>
        public bool EnableContentTypeOptions { get; set; } = true;

        /// <summary>
        /// 是否启用框架选项（防止点击劫持）
        /// </summary>
        public bool EnableFrameOptions { get; set; } = true;

        /// <summary>
        /// 是否启用内容安全策略
        /// </summary>
        public bool EnableContentSecurityPolicy { get; set; } = true;

        /// <summary>
        /// 内容安全策略配置
        /// </summary>
        public string ContentSecurityPolicy { get; set; } = @"
                            default-src 'self';
                            script-src 'self' 'unsafe-inline' 'unsafe-eval' https:;
                            style-src 'self' 'unsafe-inline' https:;
                            img-src 'self' data: https:;
                            font-src 'self' data: https:;
                            connect-src 'self' wss: ws: https:;
                            connect-src 'self' https:;
                            frame-ancestors 'self';
                            base-uri 'self';
                            form-action 'self';
                            upgrade-insecure-requests;";

        /// <summary>
        /// 是否启用缓存控制
        /// </summary>
        public bool EnableCacheControl { get; set; } = true;

        /// <summary>
        /// 缓存控制指令
        /// <remark>
        /// •	no-store: 禁止存储响应内容
        /// •	no-cache: 强制每次请求验证缓存
        /// •	must-revalidate: 过期缓存必须验证
        /// •	private: 仅允许浏览器缓存
        /// </remark>
        /// </summary>
        public string CacheControl { get; set; } = "no-store, no-cache, must-revalidate, private";

        /// <summary>
        /// 是否启用Pragma no-cache
        /// </summary>
        public bool EnablePragmaNoCache { get; set; } = true;

        /// <summary>
        /// 是否启用Expires
        /// </summary>
        public bool EnableExpires { get; set; } = true;

        /// <summary>
        /// 创建默认配置
        /// </summary>
        /// <returns></returns>
        public static SecurityHeadersOptions CreateDefault()
        {
            return new SecurityHeadersOptions();
        }
    }
}

// default-src 'self' :	作为所有未明确指定的资源类型的默认策略,'self' 表示仅允许从当前域名加载资源
// script-src 'self' 'unsafe-inline' 'unsafe-eval' https: :	允许从当前域名加载脚本, 允许内联脚本和 eval() 函数, 允许从 HTTPS 加载脚本
// style-src 'self' 'unsafe-inline' https: :	允许从当前域名加载样式表, 允许内联样式, 允许从 HTTPS 加载样式表
// img-src 'self' data: https: :	允许从当前域名加载图像, 允许使用 data URI 加载图像, 允许从 HTTPS 加载图像
// font-src 'self' data: https: :	允许从当前域名加载字体, 允许使用 data URI 加载字体, 允许从 HTTPS 加载字体
// connect-src 'self' https: :	允许从当前域名加载连接, 允许从 HTTPS 加载连接
// frame-ancestors 'self' :	允许当前页面被同一域名的 iframe 嵌套
// base-uri 'self' :	限制文档的基本 URL 只能是当前域名
// form-action 'self' :	限制表单提交的目标只能是当前域名
// upgrade-insecure-requests :	自动将 HTTP 请求升级为 HTTPS 请求

//   - 严格安全模式：

//```json
//     "ContentSecurityPolicy": "default-src 'self'; script-src 'self'; style-src 'self'; frame-ancestors 'none'"

//```

//   -一般安全模式（推荐）：

//```json
//     "ContentSecurityPolicy": "default-src 'self'; script-src 'self' 'unsafe-inline' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; frame-ancestors 'self'"

//```

//   -宽松模式：

//```json
//     "ContentSecurityPolicy": "default-src * 'unsafe-inline' 'unsafe-eval' data: blob:; frame-ancestors 'self'"

//```